#include <stdio.h>

int removeElement(int* nums, int numsSize, int val) {
	int left = 0;
	int right = 0;
	for (int i = 0; i < numsSize; ++i) {
		if (nums[i] != val) {
			nums[left] = nums[right];
			left++;
			right++;
		}
		else {
			right++;
		}
	}
	return left;
}

int removeDuplicates(int* nums, int numsSize) {
	int left = 0;
	int right = 0;

	for (int i = 0; i < numsSize; ++i) {
		if (nums[left] == nums[right]) {
			right++;
		}
		else {
			left++;
			nums[left] = nums[right];
			right++;
		}
	}
	return left + 1;
}
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
	int end1 = m - 1;
	int end2 = n - 1;
	int end3 = m + n - 1;


	while (end1 >= 0 && end2 >= 0) {
		if (nums1[end1] < nums2[end2]) {
			nums1[end3--] = nums2[end2--];
		}
		else {
			nums1[end3--] = nums1[end1--];
		}
	}

	while (end2 >= 0) {
		nums1[end3--] = nums2[end2--];
	}
}

void reverse(int arr[], int left, int right) {
	while (left < right) {
		int tmp = arr[left];
		arr[left] = arr[right];
		arr[right] = tmp;
		left++;
		right--;
	}
}

void rotate(int* nums, int numsSize, int k) {
	k %= numsSize;
	k = numsSize - k;
	reverse(nums, 0, k - 1);
	reverse(nums, k, numsSize - 1);
	reverse(nums, 0, numsSize - 1);
}



//int main() {
//	int a[4] = { 1, 2, 3, 4 };
//	//&a 代表整个数组地址 + 1 加到整个数组最后一个元素的下一个元素位置
//	//强转为int* ++ 和 -- 变为+int类型大小
//	//ptr[-1] 就是访问 *(ptr - 1) 位置元素 由于当前ptr指向数组最后一个元素的下一个元素位置
//	//-1也就是减去类型大小int 就到了数组最后一个元素位置 解引用 就是以16进制打印数组最后一个元素
//	//0x4
//	int* ptr1 = (int*)(&a + 1);
//
//	//a单独出现 代表数组首元素地址 也就是&a[0] 强转为int 再加一 说明给ptr2的指针加1个字节
//	//a数组在内存中的存储本来为
//	//01 00 00 00  02 00 00 00  03 00 00 00  04 00 00 00 (小端存储)
//	//此时地址加一个字节 ptr2指向了下一个字节
//	//此时ptr指向的内容在内存中的存储为
//	//00 00 00 02  00 00 00 03  00 00 00 04  00 00 00 ??
//	//此时再对ptr2解引用 ptr类型为int* 解引用访问一个int类型 
//	//此时访问的数据为 00 00 00 02(小端存储)
//	//用16进制打印为
//	// 02000000
//	int* ptr2 = (int*)((int)a + 1);
//	printf("%x,%x", ptr1[-1], *ptr2);
//	return 0;
//}


//int main() {
//	int i = -20;
//	// y 10000000 00000000 00000000 00010100
//	// f 11111111 11111111 11111111 11101011
//	// 
//	// 
//	// b 11111111 11111111 11111111 11101100
//	// +
//	// y 00000000 00000000 00000000 00001010
//	// b 11111111 11111111 11111111 11110110
//
//	//   11111111 11111111 11111111 11110101
//	// y 10000000 00000000 00000000 00001010
//	unsigned  int  j = 10;
//
//	printf("%d\n", i + j);
//	return 0;
//}



int main()
{
	int a[4] = { 1, 2, 3, 4 };
	int* ptr1 = (int*)(&a + 1);
	int* ptr2 = (int*)((int)a + 1);
	printf("%x,%x", ptr1[-1], *ptr2);
	return 0;
}